iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0

今天就要寫出第一個CMake值專案啦!主要流程和上一篇介紹的流程一樣。
先使用CMake讀取CMakeLists.txt後生成Makefile, 接下來用Make讀取Makefile後調用g++編譯出最終的執行檔。
https://ithelp.ithome.com.tw/upload/images/20230918/20162026prFjMp2W3F.png

目錄架構

├── CMakeLists.txt
└── main.cpp

CMake語法

project

定義:定義此項目名稱為PROJECT-NAME, 也會新增一些隱式變量

project(<PROJECT-NAME> LANGUAGES <language-name>...])
PROJECT-NAME: 此項目名稱
language-neme: 使用何種編譯器, C = C, CXX = C++ 。
---
此外還會定義出來的變數
${CMAKE_PROJECT_NAME} : 項目名稱
${PROJECT_SOURCE_DIR},${<PROJECT-NAME>_SOURCE_DIR} : 項目源目錄的絕對路徑。
${PROJECT_BINARY_DIR},${<PROJECT-NAME>_BINARY_DIR} : 項目二進制目錄的絕對路徑。

add_executable

定義:使用指定的source code 編譯後將可執行檔新增至專案。

add_executable (<name> [source1] [source2] ...)
---
name:可執行目標文件的名稱,在一個cmake工程中,這個名稱必須全局唯一。
---
[source1] [source2 ...]:構建執行檔所需要的原始碼。

message

定義:將訊息印出。

message([<mode>] "message text" ...)
---
mode: 輸出訊息模式
mode = SEND_ERROR : 產生錯誤, 生成過程被跳過
mode = STATUS : 輸出前綴為 - 的一般訊息
mode = FATAL_ERROR : 立即中止所有cmake
---
message text: 想要輸出在terminal的訊息
"message text": 輸出文字
${Variable}: 輸出變量值

🔥 在CMake語法中,指令與變量名稱大小寫是等價的。

cmake_minimum_required

定義:設定CMake所需的最小版本。

cmake_minimum_required(VERSION <min>)
min: 最小版本

使用CMake構建專案步驟

$ git clone https://github.com/m11112089/2023_iT_CMake.git
$ cd ~/2023_iT_CMake/Day5

一、編寫CMakeLists.txt

  1. 查詢系統CMake版本

$ cmake --version

kai@esoc:~/Desktop/2023_iT_CMake/Day5$ cmake --version
cmake version 3.22.1
CMake suite maintained and supported by Kitware (kitware.com/cmake).

查詢完版本後,使用cmake_minimum_required指令設定最小版本。

cmake_minimum_required(VERSION 3.22.1)
# 根據自己的cmake版本來設定最小版本,要小於等於當前版本
  1. 設定專案名稱與使用語言
project(cmake_totorial LANGUAGES CXX)
# 設定專案名稱為cmake_totorial,且此項目使用C++
  1. 查看project()幫我們設定的變數
MESSAGE(STATUS "PROJECT_NAME " ${CMAKE_PROJECT_NAME})
MESSAGE(STATUS "SOURCE_DIR " ${PROJECT_SOURCE_DIR})
MESSAGE(STATUS "SOURCE_DIR " ${cmake_totorial_SOURCE_DIR})
message(STATUS "BINARY_DIR " ${PROJECT_BINARY_DIR})
message(STATUS "BINARY_DIR " ${cmake_totorial_BINARY_DIR})
#輸出project自動生成的變量,注意命令與變量名稱大小寫等價
  1. 將原始碼編譯成執行檔
add_executable(main main.cpp)
# 將main.cpp編譯成執行檔main

二、使用CMake讀取CMakeLists.txt生成makefile

$ cmake .

後面那個點的意思是讓CMake在本目錄(點代表本目錄,點點代表上一層目錄)尋找CMakeLists.txt進行構建。

kai@esoc:~/Desktop/2023_iT_CMake/Day5$ cmake .
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- PROJECT_NAME cmake_totorial
-- SOURCE_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- SOURCE_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- BINARY_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- BINARY_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kai/Desktop/2023_iT_CMake/Day5

在輸出訊息中可以發現剛剛設定要輸出的變量訊息

-- PROJECT_NAME cmake_totorial
-- SOURCE_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- SOURCE_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- BINARY_DIR /home/kai/Desktop/2023_iT_CMake/Day5
-- BINARY_DIR /home/kai/Desktop/2023_iT_CMake/Day5

三、 使用make讀取makefile構建執行檔

$ make

kai@esoc:~/Desktop/2023_iT_CMake/Day5$ make
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o
[100%] Linking CXX executable main
[100%] Built target main

四、 執行

$ ./main

kai@esoc:~/Desktop/2023_iT_CMake/Day5$ ./main
Hello World!!

成功印出 Hello World!! 🎉
有沒有發現CMake的語法比起Makefile友善許多呢?


上一篇
[Day 4] 工具程式比較
下一篇
[Day 6] 編譯多檔案與檔案架構
系列文
建構屬於自己的C/C++專案 : 我的30天CMake學習之旅29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言